/**
 * 实现一个带并发限制的异步调度器 Scheduler，保证同时运行的任务最多有两个
 *  addTask(1000,"1");
    addTask(500,"2");
    addTask(300,"3");
    addTask(400,"4");
    的输出顺序是：2 3 1 4

    整个的完整执行流程：

    一开始1、2两个任务开始执行
    500ms时，2任务执行完毕，输出2，任务3开始执行
    800ms时，3任务执行完毕，输出3，任务4开始执行
    1000ms时，1任务执行完毕，输出1，此时只剩下4任务在执行
    1200ms时，4任务执行完毕，输出4
 */
class Schedual {
  constructor(count) {
    this.maxCount = count || 1;
    this.runningTask = 0
    this.queen = [];
    this.wait = [];
  }

  addTask(time, result) {
    // 已经超出限制的，放入待处理的数组内
    if(this.queen.length >= this.maxCount) {
      this.wait.push(this.runTask.bind(this, time, result))
    } else {
      this.queen.push(this.runTask.bind(this, time, result))
    }
    console.log(this.queen, this.wait)
  }

  trigger() {
    // 执行调用
    let task = this.queen.shift();
    if(!task) {
      return;
    }
    task().then(() => {
      this.runningTask--;
      console.log('执行完成一个任务，剩余 '+ this.runningTask+' 个任务');
      this.addToQueen();
    })
    this.runningTask++;
    this.trigger();
  }

  addToQueen() {
    if(!this.wait.length || this.queen.length >= this.maxCount) {
      return;
    }
    this.queen.push(this.wait.shift());
    console.log(`添加任务到队列中`, this.queen)
    this.trigger();
  }

  runTask(time, result) {
    console.log(time, result)
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(`打印结果${result}`);
        resolve();
      }, time)
    });
  }
}

let s = new Schedual(2);
s.addTask(1000, 1);
s.addTask(500, 2);
s.addTask(300, 3);
s.addTask(400, 4);
s.addTask(1600, 5);
s.addTask(1000, 6);

s.trigger();
